TFDQuery在更新时的问题

daigua1987 2024-06-20 17:25:40
    Update.sql.Text := MainSql;
    MAStream := TStringStream.Create(MDelta, TEncoding.UTF8);
    MAStream.position := 0;
    Update.LoadFromStream(MAStream, sfJSON);
    for i := 0 to MainCancelList.Count - 1 do
    begin
      Update.FieldByName(MainCancelList[i]).ProviderFlags := [];
    end;
    Erorrs := Update.ApplyUpdates(0);

这是我的更新语句,通过JSON把数据传过来,还有把不更新的列也传递过来,不更新的列是否有办法直接在该过程里面通过MainSql获取出来?或者有什么其他的办法处理,我现在是用存储过程提取出来的

create proc spGetCanceStr @UpdateSql nvarchar(Max),
                          @UpdateTable nvarchar(100)
as
begin
  declare @CanceStr nvarchar(max)
  set @CanceStr=''
  create table #TableColumn
  (
    CName varchar(100)
  )
  insert into #TableColumn
  SELECT name FROM  sys.dm_exec_describe_first_result_set(@UpdateSql, NULL, 0)

  select @CanceStr=@CanceStr+CName+',' from #TableColumn where CName not in(SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@UpdateTable)
  
  drop table #TableColumn

  if isnull(@CanceStr,'')<>''
   set @CanceStr=substring(@CanceStr,1,len(@CanceStr)-1)
  select @CanceStr CanceStr
end

 

...全文
384 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

根据你的描述,想要在存储过程内通过传递的 MainSql 和 UpdateSql 获取不更新的列,可以优化现有的存储过程,通过解析传入的SQL语句以及利用SQL Server的元数据系统视图,来提取不需要更新的列。以下是改进后的存储过程以及一些解释:

改进后的存储过程


CREATE PROCEDURE spGetCanceStr
    @UpdateSql NVARCHAR(MAX),
    @UpdateTable NVARCHAR(100)
AS
BEGIN
    DECLARE @CanceStr NVARCHAR(MAX)
    SET @CanceStr = ''

    -- 临时表存储 SQL 语句的结果集字段
    CREATE TABLE #TableColumn (CName VARCHAR(100))

    -- 获取 SQL 语句的结果集字段
    INSERT INTO #TableColumn
    SELECT name
    FROM sys.dm_exec_describe_first_result_set(@UpdateSql, NULL, 0)
    
    -- 获取表的所有字段
    DECLARE @TableColumns TABLE (COLUMN_NAME NVARCHAR(100))
    INSERT INTO @TableColumns (COLUMN_NAME)
    SELECT COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @UpdateTable

    -- 查找不需要更新的列
    SELECT @CanceStr = @CanceStr + CName + ',' 
    FROM #TableColumn 
    WHERE CName NOT IN (SELECT COLUMN_NAME FROM @TableColumns)

    DROP TABLE #TableColumn

    -- 去掉最后的逗号
    IF ISNULL(@CanceStr, '') <> ''
        SET @CanceStr = SUBSTRING(@CanceStr, 1, LEN(@CanceStr) - 1)

    SELECT @CanceStr AS CanceStr
END
  • 打赏
  • 举报
回复

procedure TForm1.RefreshData;
begin
// 假设你已经有了一个 TFDQuery 组件并且已经设置了其 Connection 属性
with FDQuery1 do
begin
// 设置 SQL 查询
SQL.Text := 'SELECT * FROM YourTableName';

// 打开查询(这将执行查询并填充数据集)
Open;

// ... 在此处处理数据,例如显示在 DBGrid 或其他控件中 ...

// 如果需要再次获取最新数据,可以关闭并重新打开查询
Close;
Open; // 这将重新执行查询并获取最新数据

end;
end;

tanqth 06-21
  • 打赏
  • 举报
回复

你这样使用存储过程取,应该是比较好的方式了。从效率与方便性来说,都应该是首选。唯一的缺陷可能是对数据库的依赖。

daigua1987 06-24
  • 举报
回复
@tanqth 谢谢了,系统本身是全部基于数据来开发的所有也没什么问题了

5,699

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧